// #include <iostream>
// #include <sys/ipc.h>
// #include <sys/shm.h>
// #include <cstring>
// #include <unistd.h>
// #include "comm.hpp"

// class Init
// {
// public:
//     Init()
//     {    
//         bool r = MakeFifo(); //创建管道文件，保证使用共享内存时是同步的
//         if(!r) return;

//         key_t key = GetKey(); //key不要在应用层中使用，只在内核中标识shm的唯一性!
//         std::cout << "key : " << ToHex(key) << std::endl;    
//         //sleep(3);
    
//         shmid = Createshm(key); //创建共享内存
//         std::cout << "shmid : " << shmid << std::endl;
   
//         //sleep(10);
//         std::cout << "开始将shm挂接到进程的地址空间中" << std::endl; 
//         s = (char*)shmat(shmid, nullptr, 0); //最后一个参数设置为0，表示不适用任何特殊的标志或选项!

//         fd = open(filename.c_str(), O_RDONLY);
//     }
//     ~Init()
//     {
//         sleep(5);
//         shmdt(s); //去关联(本质是修改页表)
//         std::cout << "开始将shm从进程的地址空间中移除" << std::endl; 

//         sleep(5);
//         shmctl(shmid, IPC_RMID, nullptr); //IPC_RMID表示移除共享内存
//         std::cout << "开始将shm从OS中删除" << std::endl; 

//         close(fd);
//         unlink(filename.c_str());
//     }
// public:
//     int fd;
//     int shmid;
//     char* s;
// };


// int main()
// {
//     Init init;
//     while(true)
//     {
//         int code = 0;
//         ssize_t n = read(init.fd, &code, sizeof(code));
//         if(n > 0)
//         {
//             std::cout << "共享内存的内容: " << init.s << std::endl;
//             sleep(1);
//         }
//         else if(n == 0)
//         {
//             break;
//         }
//     }
//     sleep(10);
//     return 0;
// }



#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <cstring>
#include <unistd.h>
#include "comm.hpp"

class Init
{
public:
    Init()
    {    
        key_t key = GetKey(); //key不要在应用层中使用，只在内核中标识shm的唯一性!
        std::cout << "key : " << ToHex(key) << std::endl;    
    
        shmid = Createshm(key); //创建共享内存
        std::cout << "shmid : " << shmid << std::endl;

        std::cout << "开始将shm挂接到进程的地址空间中" << std::endl; 
        s = (char*)shmat(shmid, nullptr, 0); //最后一个参数设置为0，表示不适用任何特殊的标志或选项!
    }
    ~Init()
    {
        sleep(5);
        shmdt(s);
        std::cout << "开始将shm从进程的地址空间中移除" << std::endl;

        shmctl(shmid, IPC_RMID, nullptr); //IPC_RMID表示移除共享内存
        std::cout << "开始将shm从OS中删除" << std::endl; 

    }
public:
    int fd;
    int shmid;
    char* s;
};


int main()
{
    Init init;
    struct shmid_ds ds; //管理shm的数据结构内核对象
    shmctl(init.shmid, IPC_STAT, &ds); //查看shm属性
    std::cout << ToHex(ds.shm_perm.__key) << std::endl;
    std::cout << ds.shm_segsz << std::endl;
    std::cout << ds.shm_atime<< std::endl;
    std::cout << ds.shm_ctime << std::endl;
    std::cout << ds.shm_dtime << std::endl;
    std::cout << ds.shm_nattch << std::endl;

    return 0;
}

